﻿using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using System;
using Model;

public class DBFacade
{
    // -------------Attributter-----------------
    private SqlConnection conn;
    private SqlCommand cmd;
    string user, passwd, server, database;

    int tt;

    // -------------Konstruktører-----------------
    public DBFacade(string user, string passwd, string server, string database)
    {
        if (server == "VandSpareSystem") //tjekker hvilken db der oprettes forbindelse til - MADS 
        {
            string connectionStr = @"Data Source="+database+";Initial Catalog=" +server+";Integrated Security=SSPI";
            conn = new SqlConnection(connectionStr);
        }
        else
        {
            this.user = user;
            this.passwd = passwd;
            this.server = server;
            this.database = database;
            string connectionStr = "Server=" + server + ";DataBase='" + database + "';User ID='" + user + "';Password='" + passwd + "'";
            conn = new SqlConnection(connectionStr);
        }
        
    }


    #region Generelle metoder
    // ------------ Generelle metoder -------------------------------------------------------------------------------------------------
    public void Connect()
    {
        try
        {
            //Skab forbindelses-objekt udfra conn string
            cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
        }
        catch { }
    }

    public void ForbindTilDB()
    {
        conn.Open();
        tt = tt + 1;
        Console.WriteLine(tt);
    }

    public void LukForbindelse()
    {
        conn.Close();
    }


    public bool CheckForbindelse()
    {
        if (server == "VandSpareSystem")
        {

            try
            {
                conn.Open();
                conn.Close();
                return true;
            }
            catch
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();

                return false;
            }
        }
        else
        {
            try
            {
                conn.Open();
                conn.Close();
                return true;
            }
            catch
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();

                return false;
            }
        }
    }


    private SqlDbType type(object obj)
    {
        if (obj.GetType() == typeof(int))
            return SqlDbType.Int;
        else if (obj.GetType() == typeof(string))
            return SqlDbType.NVarChar;
        else if (obj.GetType() == typeof(double))
            return SqlDbType.Float;
        else if (obj.GetType() == typeof(long))
            return SqlDbType.BigInt;
        else if (obj.GetType() == typeof(DateTime))
            return SqlDbType.DateTime;
        else return SqlDbType.Bit;
    }


    public bool SkrivTilDB(string[] parametre, object[] values, string procedure)
    {
        cmd.CommandText = procedure;

        cmd.Parameters.Clear();
        SqlDbType t;

        for(int i = 0;i<parametre.Length ; i++)
        {
           t = type(values[i]);
           if (t != SqlDbType.Bit)
           {
               SqlParameter par = new SqlParameter("@" + parametre[i], type(values[i]));
               par.Value = values[i];
               cmd.Parameters.Add(par);
           }
        }
        try
        {
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        catch
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
            return false;
        }
        return true;
    }


    public List<Object> HentFraDB(string[] parametre, string procedure, object[] values, string[] test, bool oc)
    {
        SqlDataReader datareader;
        List<Object> returListe = new List<Object>();
        cmd.Parameters.Clear();
        cmd.CommandText = procedure;
        SqlDbType t;
        

            if (values.Length != 0)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    t = type(values[i]);
                    if (t != SqlDbType.Bit)
                    {
                        SqlParameter par = new SqlParameter("@" + test[i], type(values[i]));
                        par.Value = values[i];
                        cmd.Parameters.Add(par);
                    }
                }
            }
            if (conn.State == ConnectionState.Closed)
                ForbindTilDB();
        try
        {       
               

            datareader = cmd.ExecuteReader();
            
            while (datareader.Read() == true)
            {
                
                for (int i = 0; i < parametre.Length; i++)
                {
                    
                    returListe.Add(datareader[parametre[i]]);
                }
                
            }
           if (conn.State == ConnectionState.Open)
           conn.Close();
            
        }
        catch(Exception ex)
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
            Console.WriteLine(ex.ToString());
            return null;
        }
        datareader = null;
        return returListe;
    }


    #endregion

    #region Opstart af program
    // ------------ Start af program - hent data fra database til model -------------------------------------------------------------------------------
    //mads fylder kundeCol
    public List<Kunde> FyldKundeCol()
    {
        string storedPro = "HentAlleKunder";
        string[] parametre = { "kundenr", "navn", "adresse", "bynavn", "postnr", "cvr", "ean", "kontonr", "email" };
        object[] values = { };
        string[] test = { };

        List<Kunde> kliste = new List<Kunde>();
        List<Object> oliste = new List<Object>(HentFraDB(parametre, storedPro, values, test,false));

        for (int i = 0; i < oliste.Count; i = i + 9)
        {
            kliste.Add(new Kunde((int)oliste[i + 0], (string)oliste[i + 1], (string)oliste[i + 2], (string)oliste[i + 3], (int)oliste[i + 4], (int)oliste[i + 5], (int)oliste[i + 6], (long)oliste[i + 7], (string)oliste[i + 8]));
        }

        return kliste;
    }


    public List<Artikel> HentAlleArtikler()
    {
        string storedPro = "HentAlleArtikler";
        string[] parametre = { "varenr", "beskrivelse", "literprminut", "pris" };
        object[] values = { };
        string[] test = { };

        List<Artikel> kliste = new List<Artikel>();
        List<Object> oliste = new List<Object>(HentFraDB(parametre, storedPro, values, test,false));

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 4)
            {
                kliste.Add(new Artikel((int)oliste[i + 0], (string)oliste[i + 1], (double)oliste[i + 2], (double)oliste[i + 3]));
            }
       

        return kliste;
    }


    //mads henter virksomhedstyper
    public List<Virksomhedsdata> FyldVirksomhedCol(int kundenr)
    {
        string storedPro = "HentVirksomhedsType";
        string[] parametre = { "virksomhedsid", "navn", "nuvaerendeforbrug", "forbrugmeddyse", "sidsteaarsforbrug", "antalpersoner", "vandpris", "vandafgift" };//8 parameter
        object[] values = { kundenr };
        string[] test = { "kundenr" };

        List<Virksomhedsdata> Vliste = new List<Virksomhedsdata>();

        List<Object> oliste = new List<object>();

        oliste = HentFraDB(parametre, storedPro, values, test,false);

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 8)
            {

                Vliste.Add(new Virksomhedsdata((int)oliste[i + 0], (string)oliste[i + 1], (double)oliste[i + 2], (double)oliste[i + 3], (double)oliste[i + 4], (int)oliste[i + 5], (double)oliste[i + 6], (double)oliste[i + 7]));
            }
        return Vliste;
    }


    //mads henter installationer til hver kunde's virksomhedsdata's installationer
    public List<Installation> FyldInstallationsListe(int virksomhedsid)
    {
        string storedPro = "HentInstallationer";
        string[] parametre = { "installationsid", "forbrugpct", "betegnelse" };//3 parameter
        object[] values = { virksomhedsid };
        string[] test = { "virksomhedsid" };

        List<Installation> Iliste = new List<Installation>();

        List<Object> oliste = new List<object>();

        oliste = HentFraDB(parametre, storedPro, values, test,false);

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 3)
            {

                Iliste.Add(new Installation((double)oliste[i + 1], (string)oliste[i + 2]));
            }
        return Iliste;
    }


    //MADS - henter kundens TILBUD
    public List<Tilbud> FyldTilbudsliste(int kundenr)
    {
        string storedPro = "HentTilbud";
        string[] parametre = { "dato", "kobssum", "besparelse" };//3 parameter
        object[] values = { kundenr };
        string[] test = { "kundenr" };

        List<Tilbud> Tliste = new List<Tilbud>();

        List<Object> oliste = new List<object>();

        oliste = HentFraDB(parametre, storedPro, values, test,false);

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 3)
            {

                Tliste.Add(new Tilbud((DateTime)oliste[i + 0], (double)oliste[i + 1], (double)oliste[i + 2]));
            }
        return Tliste;
    }


    //mads - fylder tilbuds tilbudslinieliste
    public List<Tilbudslinie> FyldTilbudslinieListe(int tilbudsid)
    {
        string storedPro = "HentTilbudsLinie";
        string[] parametre = { "tilbudslinieid", "antal", "varenr", "beskrivelse", "pris", "tilbudsid" };//6 parameter
        object[] values = { tilbudsid };
        string[] test = { "tilbudsid" };

        List<Tilbudslinie> TLliste = new List<Tilbudslinie>();

        List<Object> oliste = new List<object>();

        oliste = HentFraDB(parametre, storedPro, values, test,false);

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 6)
            {
                TLliste.Add(new Tilbudslinie((int)oliste[i + 1], (int)oliste[i+2], (string)oliste[i+3], (double)oliste[i+4]));
            }
        return TLliste;
    }
    #endregion

    #region Arbejde med artikler
    // ------------ Arbejde med artikler -------------------------------------------------------------------------------------------------
    public bool GemArtikel(Artikel artikel)
    {

        string[] parametre = { "varenr", "beskrivelse", "literprminut", "pris" };
        object[] values = { artikel.Varenr, artikel.Beskrivelse, artikel.Literprmin, artikel.Pris };

        string storedPro = "OpretArtikel";
        return SkrivTilDB(parametre, values, storedPro);
    }


    public bool SletArtikel(int varenr)
    {
        string[] parametre = { "varenr" };
        object[] values = { varenr };

        string storedPro = "SletArtikel";
        return SkrivTilDB(parametre, values, storedPro);
    }


    public bool OpdaterArtikel(int varenr, double pris, double ltrprmin, string beskrivelse)
    {
        string[] parametre = { "varenr", "beskrivelse", "literprminut", "pris" };
        object[] values = { varenr, beskrivelse, ltrprmin, pris };

        string storedPro = "OpdaterArtikel";
        return SkrivTilDB(parametre, values, storedPro);
    }


    //mads finder tilbudslinies artikel
    public Artikel HentArtikel(int varenr)
    {
        string storedPro = "HentArtikel";
        string[] parametre = { "varenr", "beskrivelse", "literprminut", "pris" };//1 parameter
        object[] values = { varenr };
        string[] test = { "varenr" };

        Artikel artikel = null;

        List<Object> oliste = new List<object>();

        oliste = HentFraDB(parametre, storedPro, values, test, true);

        if (oliste != null)
            for (int i = 0; i < oliste.Count; i = i + 4)
            {
                artikel = new Artikel((int)oliste[i + 0], (string)oliste[i + 1], (double)oliste[i + 2], (double)oliste[i + 3]);
            }
        return artikel;
    }
    #endregion

    #region Arbejde med udregninger
    // ------------ Arbejde med udregninger -------------------------------------------------------------------------------------------------
    public bool OpretUdregning(Virksomhedsdata virkData, int kundenr)
    {
        string[] parametre = { "virksomhedsid", "navn", "nuvaerendeforbrug", "forbrugmeddyse", "sidsteaarsforbrug", "antalpersoner", "vandpris", "vandafgift", "kundenr"};
        object[] values = { virkData.Virksomhedsid, virkData.Navn, virkData.Nuvaereneforbrug, virkData.Forbrugmeddyse, virkData.Sidsteaarsforbrug, virkData.Antalpersoner, virkData.Vandpris, virkData.Vandafgift, kundenr};

        string storedPro = "AendreVirksomhedsdata";
        return SkrivTilDB(parametre, values, storedPro);
    }
    #endregion

    #region Arbejde med kunder
    // ------------ Arbejde med kunder -------------------------------------------------------------------------------------------------
    // AØ opret kunde i database
    public bool OpretKunde(int kundenr, string navn, string adresse, int postnr, int cvr, int ean, long kontonr, string email)
    {

        string[] parametre = { "kundenr", "navn", "adresse", "postnr", "ean", "cvr", "kontonr", "email" };
        string storedPro = "OpretKunde";
        object[] values = { kundenr, navn, adresse, postnr, ean, cvr, kontonr, email };

        return SkrivTilDB(parametre, values, storedPro);
    }


    //Jesper - Rediger Kunde
    public bool OpdaterKunde(int kundenr, string navn, string adresse, int postnr, int cvr, int ean, long kontonr, string email)
    {
        string[] parametre = { "kundenr", "navn", "adresse", "postnr", "cvr", "ean", "kontonr", "email" };
        object[] values = { kundenr, navn, adresse, postnr, cvr, ean, kontonr, email };

        string storedPro = "OpdaterKunde";
        return SkrivTilDB(parametre, values, storedPro);
    }


    //mads slet en kunde
    public bool SletKunde(int kundenr)
    {
        string[] parametre = { "kundenr" };
        object[] values = { kundenr};

        string storedPro = "SletKunde";
        return SkrivTilDB(parametre, values, storedPro);
    }
    #endregion

    #region Arbejde med installationer
    // ------------ Arbejde med Installationer -------------------------------------------------------------------------------------------------

    // MADs sætter nye værdier på kundens installationer
    public bool AendreInstallationsvaerdi(int virksomhedsid,Installation inst)
    {
        string[] parametre = {"virksomhedsid", "forbrugpct", "betegnelse"};
        object[] values = {virksomhedsid, inst.Forbrugspct, inst.Betegnelse};

        string storedPro = "AendreInstallationsVaerdi";
        return SkrivTilDB(parametre, values, storedPro);
    }


    // AØ tilføj installation til database
    public bool TilfoejInstallation(double forbrugpct, string betegnelse, int virksomhedsid)
    {
        string[] parametre = { "forbrugspct", "betegnelse", "virksomhedsid" };
        string storedPro = "TilfoejInstallation";
        object[] values = { forbrugpct, betegnelse, virksomhedsid };

        return SkrivTilDB(parametre, values, storedPro);
    }


    //AØ hent sidste installationsid
    public int HentMaxInstallationsId()
    {
        int installationsid = 0;
        string[] parametre = { "installationsid" };
        string storedPro = "HentMaxInstallationsid";
        object[] values = { installationsid };
        string[] test = { "installationsid" };

        List<Object> oliste = new List<object>();
        try
        {
            oliste = HentFraDB(parametre, storedPro, values, test,true);
            installationsid = Convert.ToInt32(oliste[0]);
        }
        catch
        {
        }

        return installationsid;
    }
    #endregion

    #region Arbejde med tilbud
    // ------------ Arbejde med tilbud------------------------------------------------------------------------------------------------

    //mads - gemmer et tilbud
    public bool OpretTilbud(int kundenr, int virksomhedsid, double koebssum, DateTime dato, int tilbagebetalingstid, double besparKR)
    {
        string[] parametre = { "kundenr", "virksomhedsid", "koebssum", "dato", "tilbagebetalingstid", "besparelse" };
        object[] values = { kundenr, virksomhedsid, koebssum, dato, tilbagebetalingstid, besparKR };

        string storedPro = "OpretTilbud";
        return SkrivTilDB(parametre, values, storedPro);
    }


    //mads henter nyeste tilbudsID
    public int HentTilbudsId()
    {
        int tilbudsid = 0; //for at fortælle at det er en int værdi vi sender
        string storedPro = "HentTilbudsID";
        string[] parametre = { "tilbudsid" };//1 parameter
        object[] values = { tilbudsid };
        string[] test = { "tilbudsid" };

        List<Object> oliste = new List<object>();
        oliste = HentFraDB(parametre, storedPro, values, test, true);

        int ID = Convert.ToInt32(oliste[0]);
        return ID;
    }


    //mads henter tilbudsid til brug når tilbuds tilbudslinie liste skal fyldes ved program opstart
    public int HentTilbudsLinieID(int kundenr, DateTime dato)
    {
        
        string storedPro = "HentTilbudsIDTilTilbudsLinier";
        string[] parametre = { "tilbudsid" };//1 parameter
        object[] values = { kundenr, dato};
        string[] test = { "kundenr", "datetime" };

        List<Object> oliste = new List<object>();
        oliste = HentFraDB(parametre, storedPro, values, test,false);
        
        int ID = Convert.ToInt32(oliste[0]);
        return ID;
    }
    

    //mads - gemmer en tilbudslinie
    public bool OpretTilbudsLinie(int antal, int varenr, int tilbudsid, string beskriv, double pris)
    {
        string[] parametre = { "antal", "varenr", "tilbudsid", "beskrivelse", "pris" };
        object[] values = { antal, varenr, tilbudsid, beskriv, pris };

        string storedPro = "OpretTilbudsLinie";
        return SkrivTilDB(parametre, values, storedPro);
    }
    #endregion

    #region Arbejde med virksomhedsdata
    // ------------ Arbejde med virksomhedsdata------------------------------------------------------------------------------------------------
    // AØ - OpretVirksomhedsType
    public bool OpretVirksomhedsData(string navn, double nuvaerendeforbrug, double forbrugmeddyse, double sidsteaarsforbrug, int antalpersoner, double vandpris, double vandafgift, int kundenr)
    {
        string[] parametre = {"navn", "nuvaerendeforbrug", "forbrugmeddyse", "sidsteaarsforbrug", "antalpersoner", "vandpris", "vandafgift", "kundenr" };
        object[] values = { navn, nuvaerendeforbrug, forbrugmeddyse, sidsteaarsforbrug, antalpersoner, vandpris, vandafgift, kundenr};
        string storedPro = "OpretVirksomhedsData";
        return SkrivTilDB(parametre, values, storedPro);
    }

    public int HentVirksomhedsdataid()
    {
        int virksomhedsid = 0; //for at fortælle at det er en int værdi vi sender
        string storedPro = "HentVirksomhedsID";
        string[] parametre = { "virksomhedsid" };//1 parameter
        object[] values = { virksomhedsid };
        string[] test = { "virksomhedsid" };

        List<Object> oliste = new List<object>();
        oliste = HentFraDB(parametre, storedPro, values, test,true);

        int ID = Convert.ToInt32(oliste[0]);
        return ID;
    }
#endregion
}
